zynqmp: pm: Add IOCTLs for global storage access
authorRajan Vaja <[email protected]>
Wed, 17 Jan 2018 10:39:27 +0000 (02:39 -0800)
committerJolly Shah <[email protected]>
Thu, 15 Mar 2018 17:23:49 +0000 (10:23 -0700)
Add IOCTLs to read/write global general storage and
persistent global general storage registers access.

Signed-off-by: Rajan Vaja <[email protected]>
Signed-off-by: Jolly Shah <[email protected]>
plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c
plat/xilinx/zynqmp/pm_service/pm_api_ioctl.h
plat/xilinx/zynqmp/zynqmp_def.h

index 7634b8c873d2f2bfffde851b47459dccb10be53b..3ef0272875a6e5805682c7f30f6af1c1db95e5e6 100644 (file)
@@ -395,6 +395,82 @@ static enum pm_ret_status pm_ioctl_get_pll_frac_data
        return pm_api_clk_get_pll_frac_data(pll, data);
 }
 
+/**
+ * pm_ioctl_write_ggs() - Ioctl function for writing
+ *                       global general storage (ggs)
+ * @index      GGS register index
+ * @value      Register value to be written
+ *
+ * This function writes value to GGS register.
+ *
+ * @return      Returns status, either success or error+reason
+ */
+static enum pm_ret_status pm_ioctl_write_ggs(unsigned int index,
+                                            unsigned int value)
+{
+       if (index >= GGS_NUM_REGS)
+               return PM_RET_ERROR_ARGS;
+
+       return pm_mmio_write(GGS_BASEADDR + (index << 2), 0xFFFFFFFF, value);
+}
+
+/**
+ * pm_ioctl_read_ggs() - Ioctl function for reading
+ *                      global general storage (ggs)
+ * @index      GGS register index
+ * @value      Register value
+ *
+ * This function returns GGS register value.
+ *
+ * @return      Returns status, either success or error+reason
+ */
+static enum pm_ret_status pm_ioctl_read_ggs(unsigned int index,
+                                           unsigned int *value)
+{
+       if (index >= GGS_NUM_REGS)
+               return PM_RET_ERROR_ARGS;
+
+       return pm_mmio_read(GGS_BASEADDR + (index << 2), value);
+}
+
+/**
+ * pm_ioctl_write_pggs() - Ioctl function for writing persistent
+ *                        global general storage (pggs)
+ * @index      PGGS register index
+ * @value      Register value to be written
+ *
+ * This function writes value to PGGS register.
+ *
+ * @return      Returns status, either success or error+reason
+ */
+static enum pm_ret_status pm_ioctl_write_pggs(unsigned int index,
+                                             unsigned int value)
+{
+       if (index >= PGGS_NUM_REGS)
+               return PM_RET_ERROR_ARGS;
+
+       return pm_mmio_write(PGGS_BASEADDR + (index << 2), 0xFFFFFFFF, value);
+}
+
+/**
+ * pm_ioctl_read_pggs() - Ioctl function for reading persistent
+ *                       global general storage (pggs)
+ * @index      PGGS register index
+ * @value      Register value
+ *
+ * This function returns PGGS register value.
+ *
+ * @return      Returns status, either success or error+reason
+ */
+static enum pm_ret_status pm_ioctl_read_pggs(unsigned int index,
+                                            unsigned int *value)
+{
+       if (index >= PGGS_NUM_REGS)
+               return PM_RET_ERROR_ARGS;
+
+       return pm_mmio_read(PGGS_BASEADDR + (index << 2), value);
+}
+
 /**
  * pm_api_ioctl() -  PM IOCTL API for device control and configs
  * @node_id    Node ID of the device
@@ -452,6 +528,18 @@ enum pm_ret_status pm_api_ioctl(enum pm_node_id nid,
        case IOCTL_GET_PLL_FRAC_DATA:
                ret = pm_ioctl_get_pll_frac_data(arg1, value);
                break;
+       case IOCTL_WRITE_GGS:
+               ret = pm_ioctl_write_ggs(arg1, arg2);
+               break;
+       case IOCTL_READ_GGS:
+               ret = pm_ioctl_read_ggs(arg1, value);
+               break;
+       case IOCTL_WRITE_PGGS:
+               ret = pm_ioctl_write_pggs(arg1, arg2);
+               break;
+       case IOCTL_READ_PGGS:
+               ret = pm_ioctl_read_pggs(arg1, value);
+               break;
        default:
                ret = PM_RET_ERROR_NOTSUPPORTED;
        }
index b290574c84602949dc3cf2232d8e1d5ab50e5f78..548ac9e8dfee5faec714dcd9a9973c719481ff78 100644 (file)
@@ -27,6 +27,10 @@ enum pm_ioctl_id {
        IOCTL_GET_PLL_FRAC_MODE,
        IOCTL_SET_PLL_FRAC_DATA,
        IOCTL_GET_PLL_FRAC_DATA,
+       IOCTL_WRITE_GGS,
+       IOCTL_READ_GGS,
+       IOCTL_WRITE_PGGS,
+       IOCTL_READ_PGGS,
 };
 
 enum rpu_oper_mode {
index 3feae9d41a7853ea15b802b9dcb349256fef38f2..e7fceda599fab6d0708432236c6cb037f9534062 100644 (file)
 #define IOU_SLCR_CAN_MIO_CTRL          (IOU_SLCR_BASEADDR + 0x304)
 #define IOU_SLCR_WDT_CLK_SEL           (IOU_SLCR_BASEADDR + 0x300)
 
+/* Global general storage register base address */
+#define GGS_BASEADDR           (0xFFD80030U)
+#define GGS_NUM_REGS           (4)
+
+/* Persistent global general storage register base address */
+#define PGGS_BASEADDR          (0xFFD80050U)
+#define PGGS_NUM_REGS          (4)
+
 #endif /* __ZYNQMP_DEF_H__ */